home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / packet / aprs75c / sigplot.bas < prev    next >
BASIC Source File  |  1996-03-04  |  7KB  |  217 lines

  1. DECLARE SUB InitScrn ()
  2. DECLARE SUB DoPoint (N!, SIG!, PRN$, EL$)
  3. DECLARE SUB PlotAvg (a$, N!)
  4. DECLARE SUB Gfield (a!, a$, B$)
  5. COMMON SHARED MX(), NO(), MI(), SS(), MA()
  6. DIM MX(2, 40)
  7. DIM NO(2, 99), MI(2, 99), SS(2, 99), MA(2, 99)
  8. CLS : PRINT "SIGPLOT.bas Version 1.1  by  Bob Bruninga, WB4APR"
  9. PRINT
  10. PRINT "This APRS program monitors the GPS NMEA data for the GPGSV sentence to extract"
  11. PRINT "Azimuth, Elevation and Signal strength from satellites in view.  It can"
  12. PRINT "monitor TWO GPS units simultaneously so you can compare antennas.  SIGPLOT"
  13. PRINT "displays the present Signal and maximum value for each satellite as well as"
  14. PRINT "plotting the Elevation pattern."
  15. PRINT
  16. PRINT "Each second's data is plotted as it comes in, but you may press either D or"
  17. PRINT "L to force a new screen and plot of only the AVERAGE value, minimum, and"
  18. PRINT "maximum value.  The D only shows the DOTS, but the L connects the dots"
  19. PRINT "with a LINE so that the elevation plot is easier to discern."
  20. PRINT
  21. PRINT "After about an hour of satellite movements, a signal value has been seen from"
  22. PRINT "most angles giving a smooth elevation plot.  Azimuths are currently ignored."
  23. PRINT
  24. PRINT "REMEMBER THESE Three QUESTIONABLE ASSUMPTIONS:"
  25. PRINT "  1) All satellites are transmitting equal output powers"
  26. PRINT "  2) Your AZIMUTH antenna pattern is OMNIdirectional"
  27. PRINT "  3) Your sky view is unobstructed in all directions."
  28. PRINT "This means that a satellite at 45 degrees to the east will be averaged with a"
  29. PRINT "all other satellites at 45 degrees at all other azimuths, etc."
  30. PRINT
  31. INPUT "Enter the COM# port for the 1st GPS unit (COM1 or COM2), [COM1]"; a$
  32. IF a$ = "" THEN Port$ = "COM1" ELSE Port$ = a$
  33. OPEN Port$ + ":4800,n,8,1,cs0,cd0,ds0" FOR RANDOM AS #1
  34. INPUT "Enter the COM# port for the 2nd GPS unit (COM1, COM2 or NONE), [NONE]"; a$
  35. IF UCASE$(LEFT$(a$, 1)) = "C" THEN
  36.    OPEN a$ + ":4800,n,8,1,cs0,cd0,ds0" FOR RANDOM AS #2
  37.    Port2 = 2
  38. END IF
  39. ON ERROR GOTO errortrap
  40. SCREEN 9
  41. WIDTH 80, 43
  42. CALL InitScrn
  43. DO
  44.  GOSUB More1
  45.  LOCATE 5, 1: PRINT LEFT$("1: " + a$, 79)
  46.  IF LEFT$(a$, 6) = "$GPGGA" THEN
  47.     LOCATE 43, 1: PRINT LEFT$(a$, 79);
  48.  ELSEIF LEFT$(a$, 6) = "$GPGSV" THEN
  49.     a = 7
  50.     CALL Gfield(a, a$, NSS$)
  51.     CALL Gfield(a, a$, NCS$): LOCATE 1 + VAL(NCS$), 1: PRINT LEFT$(a$, 79)
  52.     CALL Gfield(a, a$, NSA$)
  53.     L = LEN(a$) - 4
  54.     DO WHILE a > 2 AND a < L
  55.        CALL Gfield(a, a$, PRN$)
  56.        LOCATE 9 + VAL(PRN$), 1: PRINT PRN$;
  57.        CALL Gfield(a, a$, EL$): PRINT RIGHT$("    " + EL$, 4);
  58.        CALL Gfield(a, a$, AZ$): PRINT RIGHT$("    " + AZ$, 4);
  59.        CALL Gfield(a, a$, SNR$)
  60.        SIG = VAL(SNR$)
  61.        IF SIG > 20 AND SIG < 60 THEN CALL DoPoint(1, SIG, PRN$, EL$)
  62.     LOOP
  63.  END IF
  64. REM Now PORT TWO! * * * * * * * * * * * * * * * ** * * **** **
  65. IF Port2 THEN
  66.    GOSUB More2
  67.    IF a2$ = "NoComms" THEN Port2 = 0
  68.    LOCATE 6, 1: PRINT LEFT$("2: " + a2$, 79)
  69.    IF LEFT$(a2$, 6) = "$GPGGA" THEN
  70.    ELSEIF LEFT$(a2$, 6) = "$GPGSV" THEN
  71.       a = 7
  72.       CALL Gfield(a, a2$, NSS$)
  73.       CALL Gfield(a, a2$, NCS$)
  74.       CALL Gfield(a, a2$, NSA$)
  75.       L = LEN(a2$) - 4
  76.       DO WHILE a > 2 AND a < L
  77.          CALL Gfield(a, a2$, PRN$)
  78.          LOCATE 9 + VAL(PRN$), 20
  79.          CALL Gfield(a, a2$, EL$)
  80.          CALL Gfield(a, a2$, AZ$)
  81.          CALL Gfield(a, a2$, SNR$)
  82.          SIG = VAL(SNR$)
  83.          IF SIG > 20 AND SIG < 60 THEN CALL DoPoint(2, SIG, PRN$, EL$)
  84.       LOOP
  85.    END IF
  86. END IF
  87. a$ = UCASE$(INKEY$)
  88. IF a$ = "D" OR a$ = "L" THEN
  89.    CALL InitScrn
  90.    CALL PlotAvg(a$, 1)
  91.    CALL PlotAvg(a$, 2)
  92. ELSEIF a$ = "R" THEN Port2 = 2: a2$ = ""
  93. END IF
  94. IF a$ = "Q" THEN END
  95. LOOP
  96. STOP
  97.  
  98.  
  99.  
  100. More1:   t = 1: j = 1: a = 0: Strt = TIMER
  101.     DO WHILE j > 0 AND a = 0
  102.        IF ABS(TIMER - Strt) >= t THEN j = 0: a$ = "NoComms": As$ = "": EXIT DO
  103.        a = INSTR(As$, CHR$(13))
  104.        IF a > 0 THEN a$ = LEFT$(As$, a - 1): As$ = MID$(As$, a + 1): EXIT DO
  105.        IF LOC(1) > 0 THEN As$ = As$ + INPUT$(LOC(1), 1)
  106.     LOOP
  107.     DO WHILE LEFT$(a$, 1) < " " AND LEN(a$) > 0
  108.        a$ = MID$(a$, 2)
  109.     LOOP
  110.     RETURN
  111.  
  112. More2:   t = 1: j = 1: a = 0: Strt = TIMER
  113.     DO WHILE j > 0 AND a = 0
  114.        IF ABS(TIMER - Strt) >= t THEN j = 0: a2$ = "NoComms": As2$ = "": EXIT DO
  115.        a = INSTR(As2$, CHR$(13))
  116.        IF a > 0 THEN a2$ = LEFT$(As2$, a - 1): As2$ = MID$(As2$, a + 1): EXIT DO
  117.        IF LOC(2) > 0 THEN As2$ = As2$ + INPUT$(LOC(2), 2)
  118.        LOOP
  119.     DO WHILE LEFT$(a2$, 1) < " " AND LEN(a2$) > 0
  120.        a2$ = MID$(a2$, 2)
  121.     LOOP
  122.     RETURN
  123.  
  124.  
  125.  
  126. errortrap: RESUME NEXT
  127.  
  128. SUB DoPoint (N, SIG, PRN$, EL$)
  129.       
  130.     ELd = VAL(EL$)
  131.     SAT = VAL(PRN$): IF MX(N, SAT) < SIG THEN MX(N, SAT) = SIG
  132.     ELr = ELd / 57.4
  133.     SS(N, ELd) = SS(N, ELd) + SIG
  134.     NO(N, ELd) = NO(N, ELd) + 1
  135.     IF MI(N, ELd) = 0 THEN MI(N, ELd) = SIG
  136.     IF SIG > MA(N, ELd) THEN MA(N, ELd) = SIG
  137.     IF SIG < MI(N, ELd) THEN MI(N, ELd) = SIG
  138.     COE = 7 * COS(ELr)
  139.     SIE = 5 * SIN(ELr)
  140.     PRINT "  "; SIG;
  141.     PRINT RIGHT$("    " + STR$(MX(N, SAT)), 3)
  142.     C = 14: IF N = 2 THEN C = 12
  143.     x = 200: y = 300: IF N = 2 THEN x = 198: y = 302
  144.     CIRCLE (x + SIG * COE, y - SIG * SIE), 1, C
  145.       
  146. END SUB
  147.  
  148. SUB Gfield (a, a$, B$)
  149.  
  150.  B = INSTR(a + 1, a$, ",")
  151.  IF B >= a + 1 THEN B$ = MID$(a$, a + 1, B - (a + 1)) ELSE B = 1: B$ = ""
  152.  a = B
  153. END SUB
  154.  
  155. SUB InitScrn
  156.  
  157.     CLS
  158.     LOCATE 8, 1: PRINT "SAT EL  AZ  SIG MAX  SG2 MX2"
  159.     LOCATE 9, 1: PRINT "--- --  --  --- ---  --- ---"
  160.     LINE (240, 300)-(594, 48), 14, B
  161.     REM x*7 and y*5 is a square plot
  162.     FOR i = 0 TO 90
  163.         a = i / 57.4
  164.         PSET (240 + 350 * COS(a), 300 - 250 * SIN(a)), 15
  165.         PSET (240 + 280 * COS(a), 300 - 200 * SIN(a)), 15
  166.         PSET (240 + 210 * COS(a), 300 - 150 * SIN(a)), 15
  167.         IF INT(i / 10) = i / 10 THEN
  168.            CIRCLE (240 + 350 * COS(a), 300 - 250 * SIN(a)), 1, 15
  169.            CIRCLE (240 + 280 * COS(a), 300 - 200 * SIN(a)), 1, 15
  170.            CIRCLE (240 + 210 * COS(a), 300 - 150 * SIN(a)), 1, 15
  171.         END IF
  172.     NEXT
  173.     LOCATE 39, 32: PRINT "SIGNAL STRENGTH          30      40      50"
  174.    
  175.     LOCATE 27, 32: PRINT "APRS SIGPLOT v1.1"
  176.     LOCATE 29, 32: PRINT "D - shows min, avg"
  177.     LOCATE 30, 32: PRINT "    & max value DOTS"
  178.     LOCATE 32, 32: PRINT "L - shows a LINE plot"
  179.     LOCATE 34, 32: PRINT "R - will RETRY comms"
  180.     LOCATE 36, 32: PRINT "Q - to QUIT."
  181.  
  182.     LOCATE 8, 55: PRINT "Let program run for"
  183.     LOCATE 9, 55: PRINT "At least an hour to"
  184.     LOCATE 10, 55: PRINT "fill in all angles."
  185.     LOCATE 12, 65: PRINT "de WB4APR"
  186. END SUB
  187.  
  188. SUB PlotAvg (a$, N)
  189.   
  190.  First = -1
  191.  FOR i = 1 TO 90
  192.      a = i / 57.4
  193.      COE = 7 * COS(a)
  194.      SIE = 5 * SIN(a)
  195.      SA = 0: IF NO(N, i) > 0 THEN SA = SS(N, i) / NO(N, i)
  196.      IF SA > 20 AND SA < 60 THEN
  197.         x = 200: y = 300: C = 10
  198.         IF N = 2 THEN x = 198: y = 302: C = 12
  199.         IF a$ = "L" THEN
  200.            IF First THEN
  201.                 X0 = x + SA * COE: Y0 = y - SA * SIE
  202.                 First = 0
  203.            ELSE X1 = x + SA * COE: Y1 = y - SA * SIE
  204.                 LINE (X0, Y0)-(X1, Y1), C
  205.                 X0 = X1: Y0 = Y1
  206.            END IF
  207.         ELSE
  208.            CIRCLE (x + SA * COE, y - SA * SIE), 3, C
  209.         END IF
  210.         CIRCLE (x + MI(N, i) * COE, y - MI(N, i) * SIE), 1, C
  211.         CIRCLE (x + MA(N, i) * COE, y - MA(N, i) * SIE), 1, C
  212.      END IF
  213.    NEXT i
  214.  
  215. END SUB
  216.  
  217.